package _23_jmm;

/**
 * 前提，idea 安装 jclasslib 插件
 *
 * 验证：i++ 不是原子性，存在并发安全
 *      开十个线程，每个线程执行 i++ 1万次，看最后 结果 是否是 10万
 *
 * 原因分析：
 *      打开 jclasslib 插件，可以看到 jvm 字节码层面，i++ 是多个操作完成，包括 取值，+1，赋值
 *      由于这几个操作的 非原子性，导致 并发安全问题
 *
 * 解法一：使用 synchronize 关键字
 *      再次打开  jclasslib 插件，可以看到 jvm 字节码层面加了 锁
 *
 *
 *
 * @author liuhuan
 */
public class AtomicTest {

    private static int i = 0;

    public static void main(String[] args) throws InterruptedException {
        // 运行 10 个线程
        for (int j = 0; j < 10; j++) {
            Thread thread = new Thread(() -> {
                // 每个线程 加 1万次
                for (int k = 0; k < 10000; k++) {
                    synchronized (AtomicTest.class) {
                        i++;
                    }
                }
            });
            thread.start();
        }

        // 等2秒，所有线程跑完，查看最终结果
        Thread.sleep(2000);
        System.out.println("i = " + i);
    }
}
